package com.qf.openapi.web.master.controller;

import com.qf.openapi.web.master.entity.User;
import com.qf.openapi.web.master.ex.UserException;
import com.qf.openapi.web.master.service.UserService;
import com.qf.openapi.web.master.utils.Constants;
import com.qf.openapi.web.master.vo.ResultVo;
import com.qf.openapi.web.master.vo.TableVo;
import com.qf.openapi.web.master.vo.UserRegistVo;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;

import javax.servlet.http.HttpSession;
import java.io.IOException;
import java.util.Arrays;
import java.util.List;

@RestController
@RequestMapping("/user")
@Slf4j  // 引入日志对象
public class UserController {

    @Autowired
    UserService userService;
    @RequestMapping("/add")
    public ResultVo addUser(User user) throws UserException {
        log.debug("入参为:user={}",user);

        userService.addUser(user);

        return ResultVo.ok();
    }

    /**
     * 分页查询所有用户数据
     * @param page   当前页号
     * @param limit  页大小
     * @return
     */
    @GetMapping("/getall")
    public TableVo<User> getAll(Integer page,Integer limit){
        log.debug("入参为,page={},limit={}",page,limit);

        TableVo<User> vo = userService.getUserByPage(page,limit);

        return vo;
    }


    @PostMapping("/regist")
    public ResultVo regist(UserRegistVo userRegistVo,HttpSession session) throws Exception {

        //0. 打日志
        log.debug("入参，userRegistVo={}",userRegistVo);

        //1. 校验验证码是否正确
        final String sessionCaptcha = (String) session.getAttribute("captcha");

        if (sessionCaptcha == null){
            return ResultVo.error("服务器出故障了，请刷新页面重试");
        }

        if (!sessionCaptcha.equals(userRegistVo.getCaptchar())){
            return ResultVo.error("验证码错误");
        }

        //2. 验证正确，处理用户注册的业务逻辑
        userService.registUser(userRegistVo);

        //3. 如果userService.registUser方法运行时没有抛出异常，则代表注册成功了，返回响应的json

        return ResultVo.ok();

    }


    /**
     * 根据用户id查询用户，
     * @param id
     * @return 返回用户的json
     */
    @GetMapping("/get/{id}")
    public User getUser(@PathVariable("id") Integer id){



        return userService.getUser(id);
    }


    /**
     * 用户登录接口
     * @param username
     * @param password
     * @param captchar
     * @param session
     * @return 通用json数据
     */
    @PostMapping("/login")
    public ResultVo login(String username, String password, String captchar, HttpSession session){
        //0. 打印日志，把该web接口收到的参数打印到日志中
        log.debug("接口入参为:username={},password={},captchar={}",username,password,captchar);

        //1. 校验验证码是否正确
        final String sessionCaptchar = (String) session.getAttribute("captcha");

        if (sessionCaptchar!=null){
            if (!sessionCaptchar.equals(captchar)){
                // 验证码错误，直接返回错误信息

//                final ResultVo resultVo = new ResultVo(-1, "验证码错误");
                return ResultVo.error("验证码错误");
            }
        }else {
            // 如果session中没有对应的 验证码，也返回登录失败
//            final ResultVo resultVo = new ResultVo(-1, "服务器异常");
            return ResultVo.error("服务器异常");
        }

        //2. 查询数据库验证用户名和密码是否匹配
        // 如何设计service层的方法
        // （1） 要把处理业务逻辑所需要的参数都传给该方法
        //  (2) 返回值设计要满足 web接口返回json数据的需求
        User user = userService.login(username,password);

        //3. 根据user是否为null判断登录状态并返回json
        if (user==null){
            // 用户名密码错误导致的登录失败
//            return new ResultVo(-1,"用户名密码错误");
            return ResultVo.error("用户名密码错误");
        }else {
            // 登录成功
            final ResultVo vo = ResultVo.ok();
            vo.put("data",user);

            // 如何保存用户的登录状态
            // 需要在后续的请求到达时，能够判断出发请求的浏览器是否曾经登录过
            session.setAttribute(Constants.USER_LOGIN_SESSION_KEY,user);

            return vo;
        }

    }

}
